home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_se / globals.e < prev    next >
Text File  |  1998-12-22  |  13KB  |  607 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  4. --                       http://www.loria.fr/SmallEiffel
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it 
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later 
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License 
  11. -- for  more  details.  You  should  have  received a copy of the GNU General 
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. deferred class GLOBALS
  17.    --   
  18.    -- Global Tools for the SmallEiffel system.
  19.    --
  20.  
  21. inherit UNIQUE_STRING_LIST; FROZEN_STRING_LIST;
  22.    
  23. feature {NONE} -- Following shared objects are singletons :
  24.       
  25.    frozen small_eiffel: SMALL_EIFFEL is
  26.       once
  27.      !!Result.make;
  28.       end; 
  29.    
  30.    frozen system_tools: SYSTEM_TOOLS is
  31.       once
  32.      !!Result.make;
  33.       end; 
  34.    
  35.    frozen eiffel_parser : EIFFEL_PARSER is
  36.       once
  37.      !!Result.make;
  38.       end; 
  39.  
  40.    frozen unique_string: UNIQUE_STRING is 
  41.       once
  42.      !!Result.make;
  43.       end;
  44.  
  45.    frozen id_provider: ID_PROVIDER is 
  46.       once
  47.      !!Result.make;
  48.       end;
  49.  
  50.    frozen manifest_string_pool: MANIFEST_STRING_POOL is 
  51.       once 
  52.      !!Result;
  53.       end;
  54.  
  55.    frozen manifest_array_pool: MANIFEST_ARRAY_POOL is 
  56.       once 
  57.      !!Result;
  58.       end;
  59.  
  60.    frozen once_routine_pool: ONCE_ROUTINE_POOL is 
  61.       once 
  62.      !!Result;
  63.       end;
  64.  
  65.    frozen cecil_pool: CECIL_POOL is 
  66.       once 
  67.      !!Result;
  68.       end;
  69.  
  70.    frozen parser_buffer: PARSER_BUFFER is
  71.       once
  72.      !!Result.make;
  73.       end;
  74.  
  75.    frozen address_of_pool: ADDRESS_OF_POOL is 
  76.       once 
  77.      !!Result;
  78.       end;
  79.  
  80.    frozen fmt: FMT is
  81.       once
  82.      !!Result.make;
  83.       end;
  84.  
  85.    frozen short_print: SHORT_PRINT is
  86.       once
  87.      !!Result.make;
  88.       end;
  89.    
  90.    frozen eh: ERROR_HANDLER is
  91.       once
  92.      !!Result.make
  93.       end;
  94.  
  95.    frozen echo: ECHO is
  96.       once
  97.      !!Result.make;
  98.       end;
  99.    
  100.    frozen run_control: RUN_CONTROL is
  101.       once
  102.      !!Result.make;
  103.       end;
  104.    
  105.    frozen switch_collection: SWITCH_COLLECTION is
  106.       once 
  107.       end;
  108.  
  109.    frozen cpp: C_PRETTY_PRINTER is
  110.       once
  111.      !!Result.make;
  112.       end;
  113.    
  114.    frozen gc_handler: GC_HANDLER is
  115.       once
  116.      !!Result.make;
  117.       end;
  118.  
  119.    frozen exceptions_handler: EXCEPTIONS_HANDLER is 
  120.       once 
  121.      !!Result.make;
  122.       end;
  123.  
  124.    frozen jvm: JVM is
  125.       once
  126.      !!Result.make;
  127.       end;
  128.  
  129.    frozen constant_pool: CONSTANT_POOL is
  130.       once
  131.      !!Result;
  132.       end;
  133.  
  134.    frozen field_info: FIELD_INFO is
  135.       once
  136.      !!Result;
  137.       end;
  138.  
  139.    frozen code_attribute: CODE_ATTRIBUTE is
  140.       once
  141.      !!Result;
  142.       end;
  143.  
  144.    frozen method_info: METHOD_INFO is
  145.       once
  146.      !!Result;
  147.       end;
  148.  
  149. feature {NONE} -- Error messages handling :
  150.    
  151.    nb_errors: INTEGER is
  152.       do
  153.      Result := eh.nb_errors;
  154.       ensure
  155.      Result >= 0
  156.       end;
  157.    
  158.    nb_warnings: INTEGER is
  159.       do
  160.      Result := eh.nb_warnings;
  161.       ensure
  162.      Result >= 0
  163.       end;
  164.    
  165.    warning(p: POSITION; msg: STRING) is
  166.      -- Warning `msg' at position `p'.
  167.       require
  168.      not msg.empty
  169.       do
  170.      eh.add_position(p);
  171.      eh.warning(msg);
  172.       ensure
  173.      nb_warnings = old nb_warnings + 1
  174.       end;
  175.    
  176.    error(p: POSITION; msg: STRING) is
  177.      -- When error `msg' occurs at position `p'.
  178.       require
  179.      not msg.empty
  180.       do
  181.      eh.add_position(p);
  182.      eh.error(msg);
  183.       ensure
  184.      nb_errors = old nb_errors + 1
  185.       end;
  186.    
  187.    fatal_error(msg: STRING) is
  188.      -- Should not append but it is better to know :-)
  189.       require
  190.      not msg.empty
  191.       do
  192.      eh.fatal_error(msg);
  193.       end;
  194.    
  195. feature {NONE} -- Common globals buffers :
  196.  
  197.    tmp_path: STRING is ".......................................................%
  198.                        %.......................................................";
  199.  
  200.    tmp_file_read: STD_FILE_READ is
  201.       once
  202.      !!Result.make;
  203.       end;
  204.    
  205. feature {NONE} -- Globals implicits expressions :
  206.    
  207.    class_with(str: STRING): BASE_CLASS is
  208.       require
  209.      not str.empty;
  210.       do
  211.      Result := small_eiffel.get_class(str);
  212.       end;
  213.    
  214.    class_any: BASE_CLASS is
  215.       once
  216.      Result := class_with(us_any);
  217.       end;
  218.    
  219.    class_general: BASE_CLASS is
  220.       once
  221.      Result := class_with(us_general);
  222.       end;
  223.    
  224. feature {NONE} -- Globals implicits types :
  225.    
  226.    type_boolean_ref: TYPE_CLASS is
  227.       local
  228.      boolean_ref: CLASS_NAME;
  229.       once
  230.      !!boolean_ref.make(us_boolean_ref,Void);
  231.      !!Result.make(boolean_ref);
  232.       end;
  233.    
  234.    type_character_ref: TYPE_CLASS is
  235.       local
  236.      character_ref: CLASS_NAME;
  237.       once
  238.      !!character_ref.make(us_character_ref,Void);
  239.      !!Result.make(character_ref);
  240.       end;
  241.    
  242.    type_integer_ref: TYPE_CLASS is
  243.       local
  244.      integer_ref: CLASS_NAME;
  245.       once
  246.      !!integer_ref.make(us_integer_ref,Void);
  247.      !!Result.make(integer_ref);
  248.       end;
  249.    
  250.    type_real_ref: TYPE_CLASS is
  251.       local
  252.      real_ref: CLASS_NAME;
  253.       once
  254.      !!real_ref.make(us_real_ref,Void);
  255.      !!Result.make(real_ref);
  256.       end;
  257.    
  258.    type_double_ref: TYPE_CLASS is
  259.       local
  260.      double_ref: CLASS_NAME;
  261.       once
  262.      !!double_ref.make(us_double_ref,Void);
  263.      !!Result.make(double_ref);
  264.       end;
  265.    
  266.    type_pointer_ref: TYPE_CLASS is
  267.       local
  268.      pointer_ref: CLASS_NAME;
  269.       once
  270.      !!pointer_ref.make(us_pointer_ref,Void);
  271.      !!Result.make(pointer_ref);
  272.       end;
  273.    
  274.    type_boolean: TYPE_BOOLEAN is
  275.       once
  276.      !!Result.make(Void);
  277.       end;
  278.    
  279.    type_double: TYPE_DOUBLE is
  280.       once
  281.      !!Result.make(Void);
  282.       end;
  283.    
  284.    type_string: TYPE_STRING is
  285.       once
  286.      !!Result.make(Void);
  287.       end;
  288.    
  289.    type_any: TYPE_ANY is
  290.       once
  291.      !!Result.make(Void);
  292.       end;
  293.  
  294.    type_general: TYPE_CLASS is
  295.       once
  296.      !!Result.make(class_with(us_general).base_class_name);
  297.       end;
  298.  
  299.    type_none: TYPE_NONE is
  300.       once
  301.      !!Result.make(Void);
  302.       end;
  303.  
  304.    type_pointer: TYPE_POINTER is
  305.       once
  306.      !!Result.make(Void);
  307.       end;
  308.    
  309. feature {NONE} -- Globals procedures/functions :
  310.    
  311.    sort_running(run: ARRAY[RUN_CLASS]) is
  312.      -- Sort `run' to put small `id' first.
  313.       require
  314.      run.lower = 1;
  315.      run.upper >= 2;
  316.       local
  317.      min, max, buble: INTEGER;
  318.      moved: BOOLEAN;
  319.       do
  320.      from  
  321.         max := run.upper;
  322.         min := 1;
  323.         moved := true;
  324.      until
  325.         not moved
  326.      loop
  327.         moved := false;
  328.         if max - min > 0 then
  329.            from  
  330.           buble := min + 1;
  331.            until
  332.           buble > max
  333.            loop
  334.           if run.item(buble - 1).id > run.item(buble).id then
  335.              run.swap(buble - 1,buble);
  336.              moved := true;
  337.           end;
  338.           buble := buble + 1;
  339.            end;
  340.            max := max - 1;
  341.         end;
  342.         if moved and then max - min > 0 then
  343.            from  
  344.           moved := false;
  345.           buble := max - 1;
  346.            until
  347.           buble < min
  348.            loop
  349.           if run.item(buble).id > run.item(buble + 1).id then
  350.              run.swap(buble,buble + 1);
  351.              moved := true;
  352.           end;
  353.           buble := buble - 1;
  354.            end;
  355.            min := min + 1;
  356.         end;
  357.      end;
  358.       end;
  359.    
  360. feature {NONE}
  361.       
  362.    pos(line, column: INTEGER): POSITION is
  363.       require
  364.      line >= 1;
  365.      column >= 1;
  366.       do
  367.      !!Result.make(line,column);
  368.       end;
  369.    
  370. feature {NONE}
  371.    
  372.    no_errors: BOOLEAN is
  373.       do
  374.      Result := nb_errors = 0;
  375.       end;
  376.    
  377.    code_require, code_ensure: INTEGER is unique;
  378.    
  379.    character_coding(c: CHARACTER; str: STRING) is
  380.      -- Append in `str' the Eiffel coding of the character (Table 
  381.      -- in chapter 25 of ETL, page 423).
  382.      -- When letter notation exists, it is returned in priority : 
  383.      --  '%N' gives "%N", '%T' gives "%T", ... 
  384.      -- When letter notation does not exists (not in ETL table), 
  385.      -- numbered coding is used ("%/1/", "%/2/" etc).
  386.       local
  387.      special: CHARACTER
  388.       do
  389.      inspect
  390.         c
  391.      when '%A' then
  392.         special := 'A';
  393.      when '%B' then
  394.         special := 'B';
  395.      when '%C' then
  396.         special := 'C';
  397.      when '%D' then
  398.         special := 'D';
  399.      when '%F' then
  400.         special := 'F';
  401.      when '%H' then
  402.         special := 'H';
  403.      when '%L' then
  404.         special := 'L';
  405.      when '%N' then
  406.         special := 'N';
  407.      when '%Q' then
  408.         special := 'Q';
  409.      when '%R' then
  410.         special := 'R';
  411.      when '%S' then
  412.         special := 'S';
  413.      when '%T' then
  414.         special := 'T';
  415.      when '%U' then
  416.         special := 'U';
  417.      when '%V' then
  418.         special := 'V';
  419.      when '%%' then
  420.         special := '%%';
  421.      when '%'' then
  422.         special := '%'';
  423.      when '%"' then
  424.         special := '"';
  425.      when '%(' then
  426.         special := '(';
  427.      when '%)' then
  428.         special := ')';
  429.      when '%<' then
  430.         special := '<';
  431.      when '%>' then
  432.         special := '>';
  433.      else
  434.      end;
  435.      str.extend('%%');
  436.      if special = '%U' then
  437.         str.extend('/');
  438.         c.code.append_in(str);
  439.         str.extend('/');
  440.      else
  441.         str.extend(special);
  442.      end;
  443.       end;
  444.    
  445. feature {NONE}   
  446.    
  447.    runnable(collected: ARRAY[ASSERTION]; ct: TYPE; 
  448.         for:RUN_FEATURE): ARRAY[ASSERTION] is
  449.      -- Produce a runnable `collected'.
  450.       require
  451.      collected.lower = 1;
  452.      for /= Void implies ct = for.current_type;
  453.       local
  454.      i: INTEGER;
  455.      a: ASSERTION;
  456.       do
  457.      if not collected.empty then
  458.         from  
  459.            Result := collected.twin;
  460.            i := Result.upper;
  461.         until
  462.            i = 0
  463.         loop
  464.            small_eiffel.push(for);
  465.            a := Result.item(i).to_runnable(ct);
  466.            if a = Void then
  467.           error(Result.item(i).start_position,fz_bad_assertion);
  468.            else
  469.           Result.put(a,i);
  470.            end;
  471.            small_eiffel.pop;
  472.            i := i - 1;
  473.         end;
  474.      end;
  475.       end;
  476.    
  477. feature {NONE}
  478.  
  479.    sfw_connect(sfw: STD_FILE_WRITE; path: STRING) is
  480.       require
  481.      not sfw.is_connected;
  482.      path /= Void
  483.       do
  484.      sfw.connect_to(path);
  485.      if sfw.is_connected then
  486.         echo.put_string("Writing %"");
  487.         echo.put_string(path);
  488.         echo.put_string("%" file.%N");
  489.      else
  490.         echo.w_put_string("Cannot write file %"");
  491.         echo.w_put_string(path);
  492.         echo.w_put_string(fz_b0);
  493.         die_with_code(exit_failure_code);
  494.      end;
  495.       ensure
  496.      sfw.is_connected
  497.       end;
  498.  
  499. feature {NONE}   
  500.  
  501.    fatal_error_vtec_2 is
  502.       do
  503.      fatal_error("Expanded class must have no creation procedure,% 
  504.               % or only one creation procedure with%
  505.               % no arguments (VTEC.2).");
  506.       end;
  507.    
  508. feature {NONE} -- Handling of Files Suffix Names :
  509.    
  510.    eiffel_suffix: STRING is ".e";
  511.      -- Eiffel Source file suffix.
  512.  
  513.    c_suffix: STRING is ".c";
  514.      -- C files suffix.
  515.  
  516.    h_suffix: STRING is ".h";
  517.      -- Heading C files suffix.
  518.  
  519.    o_suffix: STRING is
  520.       do
  521.      Result := system_tools.o_suffix_memory;
  522.       end;
  523.  
  524.    backup_suffix: STRING is ".bak";
  525.      -- Backup suffix for command `pretty'.
  526.  
  527.    help_suffix: STRING is ".txt";
  528.      -- Suffix for SmallEiffel On-line Help Files.
  529.  
  530.    class_suffix: STRING is ".class";
  531.  
  532. feature {NONE}
  533.  
  534.    dot_precedence: INTEGER is 12; 
  535.      -- The highest precedence value according to ETL.
  536.    
  537.    atomic_precedence: INTEGER is 13;
  538.      -- Used for atomic elements. 
  539.  
  540. feature {NONE}
  541.  
  542.    jvm_root_class: STRING is
  543.      -- Fully qualified name for the jvm SmallEiffel object's
  544.      -- added root : "<Package>/<fz_jvm_root>".
  545.       once
  546.      !!Result.make(12);
  547.      Result.copy(jvm.output_name);
  548.      Result.extend('/');
  549.      Result.append(fz_jvm_root);
  550.       end;
  551.    
  552.    jvm_root_descriptor: STRING is
  553.            -- Descriptor for `jvm_root_class': "L<jvm_root_class>;"
  554.       once
  555.      !!Result.make(12);
  556.      Result.extend('L');
  557.      Result.append(jvm_root_class);
  558.      Result.extend(';');
  559.       end;
  560.  
  561. feature {NONE}
  562.  
  563.    append_u1(str: STRING; u1: INTEGER) is
  564.       require
  565.      u1.in_range(0,255);
  566.       do
  567.      str.extend(u1.to_character);
  568.       end;
  569.  
  570.    append_u2(str: STRING; u2: INTEGER) is
  571.       require
  572.      u2.in_range(0,65536)
  573.       do
  574.      append_u1(str,u2 // 256);
  575.      append_u1(str,u2 \\ 256);
  576.       end;
  577.  
  578.    append_u4(str: STRING; u4: INTEGER) is
  579.       require
  580.      u4.in_range(0,(2 ^ 31) - 1)
  581.       do
  582.      append_u2(str,u4 // 65536);
  583.      append_u2(str,u4 \\ 65536);
  584.       end;
  585.  
  586. feature {NONE} -- To build the c_frame_descriptor :
  587.  
  588.    c_frame_descriptor_local_count: COUNTER is
  589.      -- Current is not in this total.
  590.       once
  591.      !!Result;
  592.       end;
  593.  
  594.    c_frame_descriptor_format: STRING is
  595.      -- The format to print Current and other locals.
  596.       once
  597.      !!Result.make(512);
  598.       end;
  599.  
  600.    c_frame_descriptor_locals: STRING is
  601.      -- To initialize field `locals' of `se_dump_stack'.
  602.       once
  603.      !!Result.make(512);
  604.       end;
  605.  
  606. end -- GLOBALS
  607.